import Vue from 'vue'
import config from './base'
import axios from 'axios'
import qs from 'qs' // qs这个包在install  axios 时就已经装了，因为 qs 是 axios 的依赖包

const BASEURL = ''
const LOCALURL = '/api/'

// 环境的切换
if (process.env.NODE_ENV == 'development') {    
  axios.defaults.baseURL = LOCALURL;} 
else if (process.env.NODE_ENV == 'debug') {    
  axios.defaults.baseURL = BASEURL;
} 
else if (process.env.NODE_ENV == 'production') {    
  axios.defaults.baseURL = BASEURL;
}

// axios.defaults.withCredentials = true // 带cookie请求
// axios.defaults.timeout = 5000 //  请求的超时时间 500ms
/** 
 * 跳转登录页
 * 携带当前页面路由，以期在登录页面完成登录后返回当前页面
 */
// const toLogin = () => {
//   router.replace({
//       path: '/login',        
//       query: {
//           redirect: router.currentRoute.fullPath
//       }
//   });
// }

/** 
* 请求失败后的错误统一处理 
* @param {Number} status 请求失败的状态码
*/
// const errorHandle = (status, other) => {
//   // 状态码判断
//   switch (status) {
//     // 401: 未登录状态，跳转登录页
//     case 401:
//         toLogin();
//         break;
//     // 403 token过期
//     // 清除token并跳转登录页
//     case 403:
//         console.log('登录过期，请重新登录');
//         localStorage.removeItem('token');
//         // store.commit('loginSuccess', null);
//         setTimeout(() => {
//             toLogin();
//         }, 1000);
//         break;
//     // 404请求不存在
//     case 404:
//         console.log('请求的资源不存在'); 
//         break;
//     default:
//         console.log(other);   
//     }}


/** 
 * 请求拦截器 
 * 每次请求前，如果存在token则在请求头中携带token 
 */ 
// axios.interceptors.request.use(    
//   config => {        
//       // 登录流程控制中，根据本地是否存在token判断用户的登录情况        
//       // 但是即使token存在，也有可能token是过期的，所以在每次的请求头中携带token        
//       // 后台根据携带的token判断用户的登录情况，并返回给我们对应的状态码        
//       // 而后我们可以在响应拦截器中，根据状态码进行一些统一的操作。        
//       const token = store.state.token;        
//       token && (config.headers.Authorization = token);        
//       return config;    
//   },    
//  error => Promise.error(error))

// 响应拦截器
// axios.interceptors.response.use(    
//   // 请求成功
//   res => res.status === 200 ? Promise.resolve(res) : Promise.reject(res),    
//   // 请求失败
//   error => {
//       const { response } = error;
//       if (response) {
//           // 请求已发出，但是不在2xx的范围 
//           errorHandle(response.status, response.data.message);
//           return Promise.reject(response);
//       } else {
//           // 处理断网的情况
//           // eg:请求超时或断网时，更新state的network状态
//           // network状态在app.vue中控制着一个全局的断网提示组件的显示隐藏
//           // 关于断网组件中的刷新重新获取数据，会在断网组件中说明

//           // store.commit('changeNetwork', false);
//       }
//   });

axios.post = function (url, data = {}, opts = {dataType:'urlencoded',withCredentials:false}) {
  let dataType = opts.dataType //数据类型
  let contentType = 'application/x-www-form-urlencoded; charset=UTF-8'
  if (dataType === 'urlencoded') {
    data = qs.stringify(data)
  }else if (dataType === 'json') {
      contentType = 'application/json'
      data = JSON.stringify(data)
  }
  return axios({
    method: 'post', // 请求协议
    withCredentials: opts.withCredentials, // true时，发送请求会带cookie,不需要带cookie可以设置false
    timeout: 5000,
    url: url, // 请求的地址
    data: data, // post 请求的数据,很多人
    headers: {
      'Content-Type': contentType
    }
  })
}

axios.get = function (url, data = {}) {
  return axios({
    method: 'get', // 请求协议
    withCredentials: true, // true时，发送请求会带cookie,不需要带cookie可以设置false
    timeout: 5000,
    url: url, // 请求的地址
    data, // get 请求的数据
  })
}

// axios.interceptors.request.use(
//   config => {
//     if (localStorage.getItem('token') != null || localStorage.getItem('token') != undefined) {
//       config.headers.token = localStorage.getItem('token')
//     }
//     return config
//   },
//   err => {
//     return Promise.reject(err)
//   })

// axios.interceptors.response.use(function (response) {
//   if (response.data.code == '400' || response.data.code == '401') {
//     router.push('/login')
//     localStorage.removeItem('token')
//     localStorage.removeItem('userName')
//     localStorage.removeItem('headPortrait')
//     return response
//   }
//   return response
// },
// function (err) {
//   return err
// })

// axios.interceptors.response.use(response => {
//   return response.data // 只拿后台返回的json数据
// }, error => Promise.reject(error.response))
// axios.interceptors.response.use(res => {
//     if (res.data.code !== undefined) {
//       if (res.data.code !== 100) {
//         this.$message.error('数据请求失败');
//         return Promise.reject(res.data.mesg)
//       } else {
//         return res.data.data
//       }
//     } else {
//       return res.data
//     }
//   }, error => {
//       return Promise.reject(error)
// })

Vue.prototype.$axios = axios
